nRF Connect BLE 내용 정리

sys_ble.cpp / sys_ble.h

2025. 6. 2(SW개발실)

□ 주요 설명

o Zephyr 기반의 BLE(Bluetooth Low Energy) 통신 기능을 구현한 BLE 시스템 모듈(sys_ble)

o 주요 프로토콜은 NUS(Nordic UART Service)을 기반으로 데이터 송수신, 광고 설정 등 포함

□ 프로젝트 선언 및 설정

o 프로젝트 root 폴더에 prj.conf 파일에서 선언 추가

[BLE 기본 기능 관련]

- CONFIG_BT
Zephyr BLE 스택을 활성화

- CONFIG_BT_PERIPHERAL
Peripheral(주변기기) 역할(광고, 연결대기)을 수행할 수 있도록 함

- CONFIG_BT_DEVICE_NAME_DYNAMIC
BLE 기기 이름을 런타임에 변경 가능하게 허용 (bt_set_name()이 동작하려면 필수)

- CONFIG_BT_DEVICE_NAME
기본 BLE 이름. (동적으로 코드에서 바꿀 경우 무시될 수 있음)

- CONFIG_BT_MAX_CONN / CONFIG_BT_MAX_PAIRED
최대 연결 수, 페어링 수 제한
예: 여러 central이 동시 연결/페어링 못하게 제한

[Nordic UART Service (NUS)]

- CONFIG_BT_NUS
Nordic UART Service 지원
BLE를 통한 시리얼(가상 UART) 데이터 송수신에 필수

[BLE 패킷 크기/속도 관련]

- CONFIG_BT_CTLR_DATA_LENGTH_MAX=251
컨트롤러의 Data Length Extension(DLE)에서 최대 251바이트 지원하도록 설정
이 값이 높을수록 한번에 보낼 수 있는 데이터가 커짐(최대 251)

- CONFIG_BT_USER_DATA_LEN_UPDATE=y
애플리케이션에서 직접 DLE(데이터 길이 확장) 요청이 가능하도록 지원
즉, 코드에서 bt_conn_le_data_len_update()호출 가능하게 해줌

- CONFIG_BT_GATT_CLIENT=y
Peripheral이더라도 GATT Client 역할 API를 사용 가능하게 만듦
(일반적으로 GATT Server만 사용 가능, 이 옵션으로 클라이언트 API도 활성화)

- CONFIG_BT_L2CAP_TX_MTU=247
L2CAP/ATT에서 실제 데이터를 한 번에 보낼 수 있는 최대 크기(MTU)
표준은 23이지만, 확장 시 247까지 허용됨(ATT MTU=247, ATT 헤더 3바이트 → payload 244)

[BLE ACL 버퍼 관련]

- CONFIG_BT_BUF_ACL_TX_SIZE/COUNT
TX: 한 번에 보내는 ACL(논리 연결 채널) 데이터 최대 크기 / 버퍼 개수

- CONFIG_BT_BUF_ACL_RX_SIZE/COUNT
RX: 수신 패킷 최대 크기 / 수신 버퍼 개수

□ 소스코드 함수 및 기능

o 요약표

함수 이름	함수 기능 요약	설명
sys_ble_set_name	BLE 기기 이름 및 스캔 응답 이름 설정	BLE 디바이스의 이름을 설정하고, 광고의 scan response에도 이름 할당
sys_ble_connected	BLE 연결 콜백 처리	연결 시 DLE, MTU 교환, 광고 중단 등 연결 초기화 절차 수행
sys_ble_disconnected	BLE 연결 해제 콜백 처리	연결 해제 시 광고 재시작 등 해제 처리 수행
sys_ble_received	BLE 데이터 수신 콜백	NUS를 통한 데이터 수신 시 처리 및 내부 버퍼 저장, 콜백 호출
sys_ble_init	BLE 초기화 및 콜백 등록	BLE 초기화, NUS 등록, 광고 시작, 콜백 세팅 등
sys_ble_send_data	BLE 데이터 송신	NUS 채널을 통해 데이터 전송
sys_ble_printf	BLE 데이터 포맷 송신	printf 스타일 문자열 포맷 후 BLE로 전송
sys_ble_recv_data	BLE 수신 버퍼에서 데이터 읽기	내부 링버퍼에서 수신 데이터 읽어오기
sys_ble_get_address	BLE 디바이스 주소 반환	로컬 BLE 주소를 문자열로 반환
sys_ble_is_connected	연결 상태 반환	현재 BLE 연결 여부 반환
sys_ble_close	연결 종료	현재 연결된 BLE 연결 종료
sys_ble_start_adv	BLE 광고 시작	광고 데이터/스캔응답 포함하여 광고 시작
sys_ble_stop_adv	BLE 광고 중지	광고 중지
sys_ble_change_adv_interval	광고 주기 변경	광고 인터벌 동적 변경
sys_ble_send_test_packet	테스트용 패킷 전송	244바이트 테스트 데이터 송신

o 함수 설명

- sys_ble_set_name
→ BLE 기기 이름을 설정하고, scan response에 이름을 세팅
(bt_set_name()호출 및 scan response 데이터 설정)

- sys_ble_connected
→ BLE 연결 성공 시 실행
연결 객체 저장, 광고 중단, Data Length Extension 요청, MTU 교환 등
(Zephyr의 bt_conn_le_data_len_update, bt_gatt_exchange_mtu등 내부 함수 호출)

- sys_ble_disconnected
→ 연결 해제 시 실행
내부 연결 객체 클리어, 광고 재시작

- sys_ble_received
→ NUS 서비스 데이터 수신 콜백
지정된 버퍼에 데이터 저장, 필요 시 콜백 호출

- sys_ble_init
→ BLE 모듈 전체 초기화
이름, 콜백, BLE stack, 광고, NUS 서비스 등 한 번에 초기화

- sys_ble_send_data
→ 현재 연결된 기기에 데이터 전송
(Zephyr NUS 서비스의 bt_nus_send사용)

- sys_ble_printf
→ printf 스타일 포맷 문자열을 BLE로 송신
(vsnprintf로 포맷 후, sys_ble_send_data호출)

- sys_ble_recv_data
→ 수신 버퍼에서 데이터 한 건 읽기 (링버퍼 사용)
데이터 반환 및 포인터 이동

- sys_ble_get_address
→ BLE 디바이스의 주소 반환
(bt_id_get, bt_addr_le_to_str등 Zephyr 함수 사용)

- sys_ble_is_connected
→ 연결 여부 확인(내부 연결 객체 유무로 판정)

- sys_ble_close
→ 연결 종료 (Zephyr의 bt_conn_disconnect사용)

- sys_ble_start_adv
→ BLE 광고 시작.
데이터 크기 체크(31바이트 이하), 광고 시작 함수 호출

- sys_ble_stop_adv
→ BLE 광고 중지

- sys_ble_change_adv_interval
→ 광고 주기 변경 광고 중이면 중지 → 인터벌 변경 → 재시작)